package mSocket;

/**
 * @author Ajie
 * @date 2020-05-13
 * @function
 */

import io.netty.handler.codec.http.websocketx.WebSocketFrame;

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.security.PublicKey;

public class SocketServer2 {
    public static final int PORT = 10899;//监听的端口号

    public static void main(String[] args) {
        System.out.println("服务器启动...\n");
        SocketServer2 server = new SocketServer2();
        server.init();
    }

    public void init() {
        try {
            ServerSocket serverSocket = new ServerSocket(PORT);
            while (true) {
                // 一旦有堵塞, 则表示服务器与客户端获得了连接
                Socket client = serverSocket.accept();
                // 处理这次连接
                new HandlerThread(client);
            }
        } catch (Exception e) {
            System.out.println("服务器异常: " + e.getMessage());
        }
    }

    private class HandlerThread implements Runnable {
        private Socket socket;

        public HandlerThread(Socket client) {
            socket = client;
            new Thread(this).start();
        }

        // TODO: method 1
//        public void run() {
//            try {
//                // 读取客户端数据
//                InputStream inputStream = socket.getInputStream();
//                String receive = getStringFromInputStream(inputStream);
//                // 处理客户端数据
//                System.out.println("客户端发过来的内容:" + receive );
//
//                // 向客户端回复信息
//                OutputStream out = socket.getOutputStream();
//                System.out.print("请输入:\t");
//                // 发送键盘输入的一行
//                String s = new BufferedReader(new InputStreamReader(System.in)).readLine();
//                out.write(s.getBytes());
//
//                out.close();
//                inputStream.close();
//            } catch (Exception e) {
//                e.printStackTrace();
//                System.out.println("服务器 run 异常: " + e.getMessage());
//            } finally {
//                if (socket != null) {
//                    try {
//                        socket.close();
//                    } catch (Exception e) {
//                        socket = null;
//                        System.out.println("服务端 finally 异常:" + e.getMessage());
//                    }
//                }
//            }
//        }

        // TODO: method2
        public void run() {
            try {
                // 读取客户端数据
                DataInputStream input = new DataInputStream(socket.getInputStream());
                String clientInputStr = input.readUTF();//这里要注意和客户端输出流的写方法对应,否则会抛 EOFException
                // 处理客户端数据
                System.out.println("客户端发过来的内容:" + clientInputStr);

                // 向客户端回复信息
                DataOutputStream out = new DataOutputStream(socket.getOutputStream());
                System.out.print("请输入:\t");
                // 发送键盘输入的一行
                String s = new BufferedReader(new InputStreamReader(System.in)).readLine();
                out.writeUTF(s);

                out.close();
                input.close();
            } catch (Exception e) {
                e.printStackTrace();
                System.out.println("服务器 run 异常: " + e.getMessage());
            } finally {
                if (socket != null) {
                    try {
                        socket.close();
                    } catch (Exception e) {
                        socket = null;
                        System.out.println("服务端 finally 异常:" + e.getMessage());
                    }
                }
            }
        }
    }

    public static String getStringFromInputStream(InputStream inputStream) throws IOException {
        byte[] bytes = new byte[1024];
        int len;
        StringBuilder sb = new StringBuilder();
        //只有当客户端关闭它的输出流的时候，服务端才能取得结尾的-1
        while ((len = inputStream.read(bytes)) != -1) {
            System.out.println("len = "+len);
            // 注意指定编码格式，发送方和接收方一定要统一，建议使用UTF-8
            sb.append(new String(bytes, 0, len, "UTF-8"));
        }
        System.out.println("over len = "+len);
        return sb.toString();
    }
}

